#pragma once

//graph<-adjacencyWDigraph<-adjacencyWGraph<-adjacencyGraph
//                        <-adjacencyDigraph
//     <-linkedWDigraph<-linkedWGraph
//     <-linkedDigraph<-linkedGraph

template<class T>
class Graph
{
public:
    virtual ~Graph() {}
    //ADT function
    virtual int numberOfVertices() const = 0;
    virtual int numberOfEdges() const = 0;
    virtual bool existsEdge(int, int) const = 0;
    virtual void insertEdge(edge<T>*) = 0;
    virtual void eraseEdge(int, int) = 0;
    virtual int degree(int) const = 0;
    virtual int inDegree(int) const = 0;
    virtual int outDegree(int) const = 0;
    //orther function
    virtual bool directed() const = 0; //is directed?
    virtual bool weighted() const = 0; //is weithted?
    virtual vertexIterator<T>* iterator(int) = 0; //adjacent vertex
};